package org.wmq.taskschedule.common;

import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.wmq.taskschedule.algorithm.AlgorithmExecutor;
import org.wmq.taskschedule.biz.model.DO.Param;
import org.wmq.taskschedule.biz.model.VO.AlgorithmVO;
import org.wmq.taskschedule.factory.*;

import java.util.Arrays;
import java.util.List;

/**
 * 算法类型枚举类
 * 用于管理所有支持的算法类型及其对应的工厂类
 */
@Getter
@AllArgsConstructor
public enum AlgorithmTypeEnum {
    
    // 边缘检测算法
    CANNY_EDGE_DETECTOR(1, "Canny边缘检测", CannyEdgeDetectorFactory.getInstance()),
    
    // 图像二值化算法
    IMAGE_BINARIZATION(2, "图像二值化", ImageBinarizationExecutorFactory.getInstance()),
    
    // 高斯模糊算法
    GAUSSIAN_BLUR(3, "高斯模糊", GaussianBlurExecutorFactory.getInstance()),
    
    // 图像锐化算法
    IMAGE_SHARPENING(4, "图像锐化", ImageSharpeningExecutorFactory.getInstance()),
    
    // 中值模糊算法
    MEDIAN_BLUR(5, "中值模糊", MedianBlurExecutorFactory.getInstance()),
    
    // 图像缩放算法
    IMAGE_RESIZE(6, "图像缩放", ImageResizeExecutorFactory.getInstance()),
    
    // 图像旋转算法
    IMAGE_ROTATION(7, "图像旋转", ImageRotationExecutorFactory.getInstance()),
    
    // 图像灰度化算法
    GRAYSCALE_CONVERSION(8, "图像灰度化", GrayscaleConversionExecutorFactory.getInstance()),
    
    // 自适应阈值算法
    ADAPTIVE_THRESHOLD(9, "自适应阈值", AdaptiveThresholdExecutorFactory.getInstance()),
    
    // 直方图均衡化算法
    HISTOGRAM_EQUALIZATION(10, "直方图均衡化", HistogramEqualizationExecutorFactory.getInstance()),
    
    // 双边滤波算法
    BILATERAL_FILTER(11, "双边滤波", BilateralFilterExecutorFactory.getInstance()),
    
    // Sobel边缘检测算法
    SOBEL_EDGE_DETECTOR(12, "Sobel边缘检测", SobelEdgeDetectorFactory.getInstance()),
    
    // 形态学操作算法
    MORPHOLOGICAL_OPERATION(13, "形态学操作", MorphologicalOperationExecutorFactory.getInstance()),
    
    // 对比度调整算法
    CONTRAST_ADJUSTMENT(14, "对比度调整", ContrastAdjustmentExecutorFactory.getInstance());
    
    // 算法类型ID
    private final int typeId;
    
    // 算法名称
    private final String name;
    
    // 对应的算法工厂
    private final AlgorithmExecutorFactory factory;
    
    /**
     * 根据算法类型ID获取对应的枚举实例
     * @param typeId 算法类型ID
     * @return 算法类型枚举实例
     * @throws IllegalArgumentException 如果不存在对应的算法类型
     */
    public static AlgorithmTypeEnum getByTypeId(int typeId) {
        for (AlgorithmTypeEnum type : values()) {
            if (type.typeId == typeId) {
                return type;
            }
        }
        throw new IllegalArgumentException("不支持的算法类型ID: " + typeId);
    }

    public static List<AlgorithmVO> getAlgorithmVos(){
        return Arrays.stream(values()).map(type -> new AlgorithmVO(type.typeId, type.name)).toList();
    }
    
    /**
     * 获取算法执行器
     * @param param 算法参数
     * @return 算法执行器实例
     */
    public AlgorithmExecutor getAlgorithmExecutor(Param param) {
        return factory.getAlgorithmExecutor(param);
    }
}